package cn.jly.spring.boot.cloud.beans.inheritance.single_table;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

/**
 * 在 Java 面向对象的语言环境中，@Entity 之间的关系多种多样，而根据 JPA 的规范，
 * 我们大致可以将其分为以下几种：
 * <p>
 * 1 纯粹的继承，和表没关系，对象之间的字段共享。利用注解 @MappedSuperclass，
 * 协议规定父类不能是 @Entity。
 * <p>
 * 2 单表多态问题，同一张 Table，表示了不同的对象，通过一个字段来进行区分。
 * 利用@Inheritance(strategy = InheritanceType.SINGLE_TABLE)注解完成，只有父类有 @Table。
 * <p>
 * 3 多表多态，每一个子类一张表，父类的表拥有所有公用字段。
 * 通过@Inheritance(strategy = InheritanceType.JOINED)注解完成，
 * 父类和子类都是表，有公用的字段在父表里面。
 * <p>
 * 4 Object 的继承，数据库里面每一张表是分开的，相互独立不受影响。
 * 通过@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)注解完成，
 * 父类（可以是一张表，也可以不是）和子类都是表，相互之间没有关系。
 *
 * @author lanyangji
 * @description
 * @date 2020/12/10 下午 1:50
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "tbl_book")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "color", discriminatorType = DiscriminatorType.STRING)
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
}
